package IT.DataAccess;

import IT.Entities.Base;
import IT.Entities.Usuario;
import IT.Entities.UsuarioMenu;
import IT.Entities.UsuarioPermiso;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DatUsuario implements IDatUsuario{
    private Base oTotal;
    private Usuario oUsuario;
    private List<Usuario> oLista;
    private List<UsuarioMenu> oListaMenu;
    private List<UsuarioPermiso> oListaAccion;
    
    private BDConexion oBase;    
    private Connection oConexion;
    private CallableStatement oCst;    
    private ResultSet oRst;    
    
    public List<Usuario> Listar() {
       oLista = new ArrayList<Usuario>();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioListar()}");
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new Usuario(oRst.getInt("cod_usu_in"), oRst.getString("nom_usu_vc"), 
                        oRst.getString("con_usu_vc"), oRst.getInt("est_usu_int"), 
                        oRst.getString("Estado"), oRst.getInt("cod_emp_in"), 
                        oRst.getString("Empleado"), oRst.getString("cor_emp_vc")));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return oLista;
    }

    public Usuario Ind(int nCodigo) {
        oUsuario=new Usuario();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioInd(?)}");
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oUsuario.setCod_usu_in(oRst.getInt("cod_usu_in"));
                oUsuario.setNom_usu_vc(oRst.getString("nom_usu_vc"));
                oUsuario.setCon_usu_vc(oRst.getString("con_usu_vc"));                
                oUsuario.setEst_usu_int(oRst.getInt("est_usu_int"));
                oUsuario.setEstado(oRst.getString("Estado"));
                oUsuario.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oUsuario.setEmpleado(oRst.getString("Empleado"));
                oUsuario.setCor_emp_vc(oRst.getString("cor_emp_vc"));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
        return oUsuario;
    }

    public Usuario Valida(String cUsuario, String cCorreo) {
        oUsuario=new Usuario();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioValida(?,?)}");
            oCst.setString(1, cUsuario);
            oCst.setString(2, cCorreo);
            
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oUsuario.setCod_usu_in(oRst.getInt("cod_usu_in"));
                oUsuario.setNom_usu_vc(oRst.getString("nom_usu_vc"));
                oUsuario.setCon_usu_vc(oRst.getString("con_usu_vc"));                
                oUsuario.setEst_usu_int(oRst.getInt("est_usu_int"));
                oUsuario.setEstado(oRst.getString("Estado"));
                oUsuario.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oUsuario.setEmpleado(oRst.getString("Empleado"));
                oUsuario.setCor_emp_vc(oRst.getString("cor_emp_vc"));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
        return oUsuario;
    }

    public Usuario Ubi(int nCodEmpleado){
        oUsuario=new Usuario();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioUbi(?)}");
            oCst.setInt(1, nCodEmpleado);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oUsuario.setCod_usu_in(oRst.getInt("cod_usu_in"));
                oUsuario.setNom_usu_vc(oRst.getString("nom_usu_vc"));
                oUsuario.setCon_usu_vc(oRst.getString("con_usu_vc"));                
                oUsuario.setEst_usu_int(oRst.getInt("est_usu_int"));
                oUsuario.setEstado(oRst.getString("Estado"));
                oUsuario.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oUsuario.setEmpleado(oRst.getString("Empleado"));
                oUsuario.setCor_emp_vc(oRst.getString("cor_emp_vc"));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return oUsuario;
    }
    
    public List<UsuarioMenu> Permisos(int nCodigo) {
        oListaMenu=new ArrayList<UsuarioMenu>();
         
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioPermisos(?)}");
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oListaMenu.add(new UsuarioMenu(oRst.getInt("cod_mnu_in"), 
                        oRst.getString("nom_mnu_vc"),oRst.getString("des_mnu_vc"),
                        oRst.getInt("tip_mnu_in"), oRst.getString("Tipo"), 
                        oRst.getInt("orden_mnu_in")));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
            oBase=null;
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oListaMenu;
    }
    
    public List<UsuarioPermiso> Accion(int nCodigo) {
         oListaAccion=new ArrayList<UsuarioPermiso>();
         
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioAccion(?)}");
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oListaAccion.add(new UsuarioPermiso(                                          
                        oRst.getInt("cod_per_in"),
                        oRst.getInt("cod_mnu_in"),      
                        oRst.getInt("tip_perdet_in"),
                        oRst.getString("Tipo"),
                        oRst.getString("nom_mnu_vc")));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
            oBase=null;
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oListaAccion;
    }

    public int Existe(int nCodigo, String cUsuario) {
        int nResultado=0;
         try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioExiste(?,?,?)}");
            oCst.setInt(1, nCodigo);
            oCst.setString(2, cUsuario);
            oCst.registerOutParameter(3, java.sql.Types.INTEGER);
            oCst.execute();
            nResultado=oCst.getInt(3);
          
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nResultado;
    }

    public int Insertar(Usuario ent) {
       int nCodigo=0;
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioInsertar(?,?,?, ?,?)}");                 
            oCst.registerOutParameter(1, java.sql.Types.INTEGER); 
            oCst.setString(2, ent.getNom_usu_vc());
            oCst.setString(3, ent.getCon_usu_vc());
            oCst.setInt(4, ent.getEst_usu_int());
            oCst.setInt(5, ent.getCod_emp_in());
            
            oCst.execute();         
            nCodigo=oCst.getInt(1);
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }   
       return nCodigo;
    }

    public void Editar(Usuario ent) {
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioEditar(?,?,?, ?,?)}"); 
            oCst.setInt(1, ent.getCod_usu_in());
            oCst.setString(2, ent.getNom_usu_vc());
            oCst.setString(3, ent.getCon_usu_vc());
            oCst.setInt(4, ent.getEst_usu_int());
            oCst.setInt(5, ent.getCod_emp_in());
            
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }
    
    public void PanelEditar(Usuario ent) {
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioPanelEditar(?,?,?, ?,?)}"); 
            oCst.setInt(1, ent.getCod_usu_in());
            oCst.setString(2, ent.getNom_usu_vc());
            oCst.setString(3, ent.getCon_usu_vc());
            oCst.setBoolean(4, ent.isAnom_usu_bi());
            oCst.setBoolean(5, ent.isAcon_usu_bi());
            
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    public void Eliminar(int nCodigo) {
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioEliminar(?)}"); 
            oCst.setInt(1, nCodigo);            
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    public Base ListarTotales(int nCodigo) {
        oTotal =new Base();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_UsuarioTotales(?,?,?, ?,?)}");
            oCst.setInt(1, nCodigo);
            oCst.registerOutParameter(2, java.sql.Types.INTEGER);
            oCst.registerOutParameter(3, java.sql.Types.INTEGER);
            oCst.registerOutParameter(4, java.sql.Types.INTEGER);
            oCst.registerOutParameter(5, java.sql.Types.INTEGER);
            oCst.execute();
            
            oTotal.setCantidad(oCst.getInt(2)); //proyectos
            oTotal.setEtapa(oCst.getInt(3)); //administrador etapas
            oTotal.setActividad(oCst.getInt(4)); //aprobaciom
            oTotal.setAsignados(oCst.getInt(5)); //verificacions
            
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return oTotal;
    }

    public Usuario Empleado(String cUsuario) {
        oUsuario=new Usuario();
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_EmpleadoUsuario(?)}");
            oCst.setString(1, cUsuario);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oUsuario.setCod_usu_in(oRst.getInt("cod_usu_in"));
                oUsuario.setNom_usu_vc(oRst.getString("nom_usu_vc"));
                oUsuario.setCon_usu_vc(oRst.getString("con_usu_vc"));                
                oUsuario.setEst_usu_int(oRst.getInt("est_usu_int"));
                oUsuario.setEstado(oRst.getString("Estado"));
                oUsuario.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oUsuario.setEmpleado(oRst.getString("Empleado"));
                oUsuario.setCor_emp_vc(oRst.getString("cor_emp_vc"));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return oUsuario;
    }
    
}
